package main

import (
	mainservice "awesomeProject/kitex_gen/mainservice/ticketmainservice"
	"awesomeProject/rpc/ticket_main_service/config"
	"context"
	"fmt"
	"github.com/cloudwego/kitex/server"
	"github.com/go-redis/redis/v8"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"log"
	"net"
)

var DB *gorm.DB               // 全局数据库连接实例
var RedisClient *redis.Client // 全局 Redis 客户端实例

func initDB(cfg *config.Config) (*gorm.DB, error) {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		cfg.MySQL.Username,
		cfg.MySQL.Password,
		cfg.MySQL.Host,
		cfg.MySQL.Port,
		cfg.MySQL.Database,
	)
	return gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

func initRedis(cfg *config.Config) (*redis.Client, error) {
	client := redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", cfg.Redis.Host, cfg.Redis.Port),
		Password: cfg.Redis.Password,
	})

	// 测试连接
	ctx := context.Background()
	_, err := client.Ping(ctx).Result()
	if err != nil {
		log.Fatalf("Failed to connect to Redis: %v", err)
		return nil, err
	}

	return client, nil
}

func main() {
	// 加载配置文件
	cfg, err := config.LoadConfig("config.yaml")
	if err != nil {
		log.Fatalf("Failed to load configuration: %v", err)
	}

	// 初始化数据库连接
	db, err := initDB(cfg)
	if err != nil {
		log.Fatalf("Failed to initialize database connection: %v", err)
	}
	DB = db // 将数据库实例赋值给全局变量

	// 初始化 Redis 连接
	redisClient, err := initRedis(cfg)
	if err != nil {
		log.Fatalf("Failed to initialize Redis connection: %v", err)
	}
	RedisClient = redisClient

	// 初始化服务器地址
	addr, _ := net.ResolveTCPAddr("tcp",
		fmt.Sprintf("%s:%d", cfg.Server.Address, cfg.Server.Port))

	// 启动 Kitex 服务
	svr := mainservice.NewServer(new(TicketMainServiceImpl), server.WithServiceAddr(addr))

	err = svr.Run()
	if err != nil {
		log.Println(err.Error())
	}
}
